home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
tools
/
dshell
/
dsh333bs.lzh
/
bprint12.s
< prev
next >
Wrap
Text File
|
1999-07-11
|
8KB
|
438 lines
*****************************************************************
* 12ドット文字列描画 *
* Copyright 1999 Toshiyuki Murata *
*****************************************************************
.include doscall.mac
.include iocscall.mac
*
.ifndef _FNTADR
_FNTADR equ $16
.endif
.xdef _B_PRINT12
.xdef B_PRINT12
HOMEADR equ $944
CURSOR_XMAX equ $970
*CURSOR_YMAX equ $972
CURSOR_X equ $974
CURSOR_Y equ $976
COLOR equ $994
*
CRTCR21 equ $e8002a *CRTCレジスタ
CRTCR23 equ $e8002e *
*
R21 equ CRTCR21-CRTCR23
R23 equ CRTCR23-CRTCR23
*
.offset 4
str: .ds.l 1
*
.text
.even
*
* int B_PRINT12(const char *str);
*
* 現カーソル位置 (8ドット単位) から文字列 str を 12ドットフォントで表示する
* 次のカーソル x 座標 (8ドット単位) を返す
*
_B_PRINT12:
movea.l str(sp),a0
pea.l B_PRINT12(pc)
DOS _SUPER_JSR
addq.l #4,sp
rts
*
B_PRINT12:
SAVREGS reg d3-d7/a4-a5
movem.l SAVREGS,-(sp)
IOCS _B_CUROFF
move.l CURSOR_Y.w,d7
clr.w d7
lsr.l #16-11,d7 *y×128×16
add.l HOMEADR.w,d7
movea.l d7,a1
move.w CURSOR_X.w,d0
move.w d0,-(sp)
adda.w d0,a1
moveq.l #7*2,d6
move.l a1,d0
btst.l #0,d0
seq.b d0
beq @f
moveq.l #3*2,d6
subq.l #3,a1
subq.w #3,(sp)
@@: add.w CURSOR_XMAX.w,d7
addq.w #1,d7
sub.w a1,d7
ext.l d7
lsl.w #3,d7
divu.w #6,d7
subq.w #1,d7
tst.b d0
bne @f
subq.w #4,d7
@@: lea.l 128*3(a1),a1 *上3ドット, 下1ドットのマージン
move.l a1,-(sp)
lea.l CRTCR23,a5 *a5 = CRTC R23
move.w R21(a5),(sp) *CRTC R21を待避
moveq.l #3,d0
and.b COLOR.w,d0
lsl.w #4,d0
ori.w #%11_0000_0000,d0
move.w d0,R21(a5)
loop: moveq.l #0,d1
move.b (a0)+,d1 *1バイト取り出す
bpl han *00h~7fhなら1バイト文字
cmpi.b #$a0,d1 *80h~9fhなら2バイト文字
bcs zen
cmpi.b #$e0,d1 *a0h~dfhなら1バイト文字
bcs han
*e0h~ffhなら2バイト文字
zen: move.b d1,-(sp)
move.w (sp)+,d1
move.b (a0)+,d1 *第2バイトを取り出す
beq retn *2バイト文字の途中で
* 文字列が終わっていた
cmpi.w #$8100,d1 *8000h~80ffhなら2バイト半角
bcs hanput *
cmpi.w #$f000,d1 *f000h~ffffhなら2バイト半角
bcc hanput
subq.w #1,d7 *右端までのゆとりが半角分なら
bcs retn * 抜ける
*
* 全角文字描画
*
zenput: moveq.l #6,d2 *文字パターンを取得
IOCS _FNTADR *
movea.l d0,a2 *a2 = 文字パターン
move.w ztbl(pc,d6.w),d0 *x座標 % 8に応じて
jsr ztbl(pc,d0.w) * 処理を振り分ける
subq.w #4,d6 *カウンタを更新
dbcs d7,loop *カウンタが負になるか
* 画面右端に達するまで繰り返す
bcc retn *カウンタが非負ならば画面右端
addi.w #8*2,d6 *カウンタを補正
addq.l #6,a1 *VRAMアドレスを進める
dbra d7,loop *画面右端に達するまで繰り返す
*
retn: move.w (sp)+,R21(a5) *CRTC R21を復帰
move.w a1,d0
sub.w (sp)+,d0 *描画先アドレス移動量
add.w diffTable(pc,d6.w),d0
add.w (sp)+,d0
move.w d0,CURSOR_X.w
movem.l (sp)+,SAVREGS
ext.l d0
rts
*
.dc.w 6 *-1
diffTable: .dc.w 6 *0
.dc.w 5 *1
.dc.w 4 *2
.dc.w 3 *3
.dc.w 3 *4
.dc.w 2 *5
.dc.w 1 *6
.dc.w 0 *7
.dc.w 0 *8
*
ztbl:
q = ztbl
.dc.w zput7-q
.dc.w zput6-q
.dc.w zput5-q
.dc.w zput4-q
.dc.w zput3-q
.dc.w zput2-q
.dc.w zput1-q
.dc.w zput0-q
*
*
* 半角文字描画
*
han: beq.s retn
cmpi.b #$09,d1
beq.s tab
hanput: moveq.l #6,d2 *文字パターンを取得
IOCS _FNTADR *
movea.l d0,a2 *a2 = 文字パターン
move.w htbl(pc,d6.w),d0 *x座標 % 8に応じて
jsr htbl(pc,d0.w) * 処理を振り分ける
subq.w #2,d6 *カウンタを更新
dbcs d7,loop *カウンタが負になるか
* 画面右端に達するまで繰り返す
bcc retn *カウンタが非負ならば画面右端
moveq.l #7*2,d6 *カウンタを初期化
addq.l #6,a1 *VRAMアドレスを進める
dbra d7,loop *画面右端に達するまで繰り返す
bra retn
*
htbl:
q = htbl
.dc.w hput7-q
.dc.w hput6-q
.dc.w hput5-q
.dc.w hput4-q
.dc.w hput3-q
.dc.w hput2-q
.dc.w hput1-q
.dc.w hput0-q
*
tab: lsr.w #1,d6
addq.w #1,d6
move.w d6,d0
addq.l #6,a1
moveq.l #7*2,d6
sub.w d0,d7
bcc loop
bra retn
*
* 8通りに場合分けした全角文字表示ルーチン
*
zput0: move.w #%00000000_00001111,(a5)
move.w (a2)+,$0000(a1)
move.w (a2)+,$0080(a1)
move.w (a2)+,$0100(a1)
move.w (a2)+,$0180(a1)
move.w (a2)+,$0200(a1)
move.w (a2)+,$0280(a1)
move.w (a2)+,$0300(a1)
move.w (a2)+,$0380(a1)
move.w (a2)+,$0400(a1)
move.w (a2)+,$0480(a1)
move.w (a2)+,$0500(a1)
move.w (a2)+,$0580(a1)
rts
*
ZPUT1 macro ofst
move.w (a2)+,d0
ror.w d1,d0
move.w d2,R23(a5)
move.w d0,ofst(a4)
move.w d3,R23(a5)
move.w d0,ofst+2(a4)
.endm
*
zput4: lea.l 2(a1),a4
moveq.l #8,d1
move.w #%11111111_00000000,d2
move.w #%00001111_11111111,d3
bra zput10
*
zput1: movea.l a1,a4
moveq.l #6,d1
move.w #%11111100_00000000,d2
move.w #%00111111_11111111,d3
zput10: ZPUT1 $0000
ZPUT1 $0080
ZPUT1 $0100
ZPUT1 $0180
ZPUT1 $0200
ZPUT1 $0280
ZPUT1 $0300
ZPUT1 $0380
ZPUT1 $0400
ZPUT1 $0480
ZPUT1 $0500
ZPUT1 $0580
rts
*
ZPUT2 macro ofst
move.w (a2)+,d0
rol.w d1,d0
move.w d2,R23(a5)
move.w d0,ofst(a4)
move.w d3,R23(a5)
move.w d0,ofst+2(a4)
.endm
*
zput7: lea.l 4(a1),a4
moveq.l #6,d1
move.w #%11111111_11000000,d2
move.w #%00000011_11111111,d3
bra zput20
*
zput5: lea.l 2(a1),a4
moveq.l #2,d1
move.w #%11111111_11111100,d2
move.w #%00000000_00111111,d3
bra zput20
*
zput2: movea.l a1,a4
moveq.l #4,d1
move.w #%11111111_11110000,d2
move.w #%00000000_11111111,d3
zput20: ZPUT2 $0000
ZPUT2 $0080
ZPUT2 $0100
ZPUT2 $0180
ZPUT2 $0200
ZPUT2 $0280
ZPUT2 $0300
ZPUT2 $0380
ZPUT2 $0400
ZPUT2 $0480
ZPUT2 $0500
ZPUT2 $0580
rts
*
ZPUT3 macro ofst
move.w (a2)+,d0
lsr.w d1,d0
move.w d0,ofst(a4)
.endm
*
zput6: move.w #%11110000_00000000,R23(a5)
lea.l 4(a1),a4
moveq.l #4,d1
bra zput30
*
zput3: move.w #%11000000_00000011,R23(a5)
lea.l 2(a1),a4
moveq.l #2,d1
zput30: ZPUT3 $0000
ZPUT3 $0080
ZPUT3 $0100
ZPUT3 $0180
ZPUT3 $0200
ZPUT3 $0280
ZPUT3 $0300
ZPUT3 $0380
ZPUT3 $0400
ZPUT3 $0480
ZPUT3 $0500
ZPUT3 $0580
rts
*
* 8通りに場合分けした半角文字表示ルーチン
*
hput4: move.w #%11111111_00000011,R23(a5)
lea.l 3(a1),a4
bra hput00
*
hput0: move.w #%00000011_11111111,R23(a5)
movea.l a1,a4
hput00: move.b (a2)+,(a4)
move.b (a2)+,$0080(a4)
move.b (a2)+,$0100(a4)
move.b (a2)+,$0180(a4)
move.b (a2)+,$0200(a4)
move.b (a2)+,$0280(a4)
move.b (a2)+,$0300(a4)
move.b (a2)+,$0380(a4)
move.b (a2)+,$0400(a4)
move.b (a2)+,$0480(a4)
move.b (a2)+,$0500(a4)
move.b (a2)+,$0580(a4)
rts
*
HPUT1 macro ofst
move.b (a2)+,d0
lsl.w d1,d0
move.w d0,ofst(a4)
.endm
*
hput6: move.w #%11110000_00111111,R23(a5)
lea.l 4(a1),a4
moveq.l #4,d1
bra hput10
*
hput1: move.w #%11111100_00001111,R23(a5)
movea.l a1,a4
moveq.l #2,d1
hput10: HPUT1 $0000
HPUT1 $0080
HPUT1 $0100
HPUT1 $0180
HPUT1 $0200
HPUT1 $0280
HPUT1 $0300
HPUT1 $0380
HPUT1 $0400
HPUT1 $0480
HPUT1 $0500
HPUT1 $0580
rts
*
HPUT2 macro ofst
move.b (a2)+,d0
rol.b d1,d0
move.b d0,ofst(a4)
move.b d0,ofst+1(a4)
.endm
*
hput5: move.w #%00001111_11111100,R23(a5)
lea.l 3(a1),a4
moveq.l #2,d1
bra hput20
*
hput2: move.w #%00111111_11110000,R23(a5)
lea.l 1(a1),a4
moveq.l #4,d1
hput20: HPUT2 $0000
HPUT2 $0080
HPUT2 $0100
HPUT2 $0180
HPUT2 $0200
HPUT2 $0280
HPUT2 $0300
HPUT2 $0380
HPUT2 $0400
HPUT2 $0480
HPUT2 $0500
HPUT2 $0580
rts
*
HPUT3 macro ofst
move.b (a2)+,d0
lsr.b #2,d0
move.b d0,ofst(a4)
.endm
*
hput7: move.w #%11111111_11000000,R23(a5)
lea.l 5(a1),a4
bra hput30
*
hput3: move.w #%11000000_11111111,R23(a5)
lea.l 2(a1),a4
hput30: HPUT3 $0000
HPUT3 $0080
HPUT3 $0100
HPUT3 $0180
HPUT3 $0200
HPUT3 $0280
HPUT3 $0300
HPUT3 $0380
HPUT3 $0400
HPUT3 $0480
HPUT3 $0500
HPUT3 $0580
rts
.end